package com.bookrecomm.controller;

import com.bookrecomm.service.ReadHistoryService;
import com.bookrecomm.vo.BookVO;
import com.bookrecomm.vo.PageVO;
import com.bookrecomm.vo.ReadHistoryVO;
import com.bookrecomm.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

/**
 * 阅读历史控制器
 * 处理用户阅读历史相关的请求
 */
@RestController
@RequestMapping("/read-history")
public class ReadHistoryController {

    @Autowired
    private ReadHistoryService readHistoryService;

    /**
     * 添加或更新阅读历史（需要登录）
     * @param bookId 图书ID
     * @param progress 阅读进度（0-100）
     * @return 添加或更新结果
     */
    @PostMapping("/{bookId}")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<Boolean> addOrUpdateReadHistory(
            @PathVariable Long bookId,
            @RequestParam Integer progress) {
        
        boolean success = readHistoryService.addOrUpdateReadHistory(null, bookId, progress);
        return ResultVO.success("更新成功", success);
    }

    /**
     * 获取当前用户的阅读历史列表（需要登录）
     * @param page 页码（从1开始）
     * @param size 每页大小
     * @return 分页阅读历史列表
     */
    @GetMapping("/me")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<PageVO<ReadHistoryVO>> getMyReadHistory(
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size) {
        
        // 创建分页参数
        Pageable pageable = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.DESC, "lastReadTime"));
        
        // 查询阅读历史列表
        PageVO<ReadHistoryVO> pageVO = readHistoryService.getUserReadHistory(null, pageable);
        return ResultVO.success("获取成功", pageVO);
    }

    /**
     * 获取指定用户的阅读历史列表
     * @param userId 用户ID
     * @param page 页码（从1开始）
     * @param size 每页大小
     * @return 分页阅读历史列表
     */
    @GetMapping("/user/{userId}")
    public ResultVO<PageVO<ReadHistoryVO>> getUserReadHistory(
            @PathVariable Long userId,
            @RequestParam(defaultValue = "1") int page,
            @RequestParam(defaultValue = "10") int size) {
        
        // 创建分页参数
        Pageable pageable = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.DESC, "lastReadTime"));
        
        // 查询阅读历史列表
        PageVO<ReadHistoryVO> pageVO = readHistoryService.getUserReadHistory(userId, pageable);
        return ResultVO.success("获取成功", pageVO);
    }

    /**
     * 获取当前用户最近阅读的图书列表（需要登录）
     * @param limit 限制数量
     * @return 最近阅读的图书列表
     */
    @GetMapping("/recently-read")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<PageVO<BookVO>> getMyRecentlyRead(
            @RequestParam(defaultValue = "10") int limit) {
        
        PageVO<BookVO> pageVO = readHistoryService.getRecentlyRead(null, limit);
        return ResultVO.success("获取成功", pageVO);
    }

    /**
     * 获取指定用户最近阅读的图书列表
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 最近阅读的图书列表
     */
    @GetMapping("/user/{userId}/recently-read")
    public ResultVO<PageVO<BookVO>> getUserRecentlyRead(
            @PathVariable Long userId,
            @RequestParam(defaultValue = "10") int limit) {
        
        PageVO<BookVO> pageVO = readHistoryService.getRecentlyRead(userId, limit);
        return ResultVO.success("获取成功", pageVO);
    }

    /**
     * 获取用户的阅读进度（需要登录）
     * @param bookId 图书ID
     * @return 阅读进度（0-100）
     */
    @GetMapping("/progress/{bookId}")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<Integer> getReadProgress(@PathVariable Long bookId) {
        Integer progress = readHistoryService.getReadProgress(null, bookId);
        return ResultVO.success("获取成功", progress);
    }

    /**
     * 删除阅读历史（需要登录）
     * @param bookId 图书ID
     * @return 删除结果
     */
    @DeleteMapping("/{bookId}")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<Boolean> deleteReadHistory(@PathVariable Long bookId) {
        boolean success = readHistoryService.deleteReadHistory(null, bookId);
        return ResultVO.success("删除成功", success);
    }

    /**
     * 清空当前用户的阅读历史（需要登录）
     * @return 清空结果
     */
    @DeleteMapping("/clear")
    @PreAuthorize("isAuthenticated()")
    public ResultVO<Boolean> clearReadHistory() {
        boolean success = readHistoryService.clearReadHistory(null);
        return ResultVO.success("清空成功", success);
    }

    /**
     * 获取用户阅读历史数量
     * @param userId 用户ID
     * @return 阅读历史数量
     */
    @GetMapping("/count/user/{userId}")
    public ResultVO<Long> countUserReadHistory(@PathVariable Long userId) {
        Long count = readHistoryService.countUserReadHistory(userId);
        return ResultVO.success("获取成功", count);
    }
}
